基于ROS实现人脸跟随(关键词:人脸跟随,ROS,OpenCV,arduino)

您所在的位置:网站首页 ros 跟随 基于ROS实现人脸跟随(关键词:人脸跟随,ROS,OpenCV,arduino)

基于ROS实现人脸跟随(关键词:人脸跟随,ROS,OpenCV,arduino)

#基于ROS实现人脸跟随(关键词:人脸跟随,ROS,OpenCV,arduino)| 来源: 网络整理| 查看: 265

该测试欲达成目标是实现人脸跟随!

1 硬件

摄像头:1个;

USB数据线:1个;

舵机:1个;

Arduino控制板:1个。

此处应有图:

1.1 准备

这里需要使用usb-cam软件包:

$ cd ~/catkin_ws/src $ git clone https://github.com/bosch-ros-pkg/usb_cam.git $ cd ~/catkin_ws $ catkin_make

 注意:下面的程序运行前,需要启动usb_cam节点。

roslaunch usb_cam usb_cam-test.launch

运行上面的节点,这时该节点会不断的发布/usb_cam/image_raw话题。如下图所示:

下面的程序将使用这个话题数据。

2 程序

2.1 人脸识别节点,发布一个话题"chatter",为人脸在图像的位置。

#include #include #include #include #include #include #include #include #include using namespace std; using namespace cv; CascadeClassifier face_cascade; static const std::string OPENCV_WINDOW = "Raw Image window"; class Face_Detector { ros::NodeHandle nh_; image_transport::ImageTransport it_; image_transport::Subscriber image_sub_; ros::Publisher chatter_pub; public: Face_Detector() : it_(nh_) { // Subscribe to input video feed and publish output video feed image_sub_ = it_.subscribe("/usb_cam/image_raw", 1, &Face_Detector::imageCb, this); chatter_pub = nh_.advertise("chatter", 100); cv::namedWindow(OPENCV_WINDOW); } ~Face_Detector() { cv::destroyWindow(OPENCV_WINDOW); } void imageCb(const sensor_msgs::ImageConstPtr& msg) { cv_bridge::CvImagePtr cv_ptr; namespace enc = sensor_msgs::image_encodings; try { cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { ROS_ERROR("cv_bridge exception: %s", e.what()); return; } // Draw an example circle on the video stream if (cv_ptr->image.rows > 400 && cv_ptr->image.cols > 600){ detect_faces(cv_ptr->image); //chatter_pub.publish(position_x); } } void detect_faces(cv::Mat img) { RNG rng( 0xFFFFFFFF ); std_msgs::Int16 position_x; int data; int lineType = 8; Mat frame_gray; cvtColor( img, frame_gray, COLOR_BGR2GRAY ); equalizeHist( frame_gray, frame_gray ); //-- Detect faces std::vector faces; face_cascade.detectMultiScale( frame_gray, faces ); if (faces.size()>=1){ size_t i = 0; Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 ); ellipse( img, center, Size( faces[i].width/2, faces[i].height/2 ), 0, 0, 360, Scalar( 255, 0, 255 ), 4 ); data = cvRound(faces[i].x + faces[i].width/2); position_x.data = data; chatter_pub.publish(position_x); } imshow(OPENCV_WINDOW,img); waitKey(3); } }; int main(int argc, char** argv) { //从命令行读取必要的信息,注意路径 CommandLineParser parser(argc, argv, "{help h||}" "{face_cascade|/home/junjun/projects/main2/haarcascade_frontalface_alt.xml|Path to face cascade.}"); parser.about( "\nThis program demonstrates using the cv::CascadeClassifier class to detect objects (Face + eyes) in a video stream.\n" "You can use Haar or LBP features.\n\n" ); parser.printMessage(); String face_cascade_name = parser.get("face_cascade"); //-- 1. Load the cascades if( !face_cascade.load( face_cascade_name ) ) { cout center_left){ position_x -= servo_step_distance; if (position_x >= 10 and position_x = 10 and position_x


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3